﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using Gestión_UTN.util;

namespace Gestión_UTN.View.general
{
    public partial class FechasExamenes : Form
    {
        private static Gestión_UTN.bl.fechaExamenbl createFechaExamen = Gestión_UTN.factories.blfactory.createFechaExamen();
        private static Gestión_UTN.bl.carrerabl createCarrera = Gestión_UTN.factories.blfactory.createCarrera();
        private static Gestión_UTN.bl.materiabl createMateria = Gestión_UTN.factories.blfactory.createMateria();
        private static Gestión_UTN.bl.tipoExamenbl createTipoExamen = Gestión_UTN.factories.blfactory.createTipoExamen();

        private static DataTable materias;
        private static DataTable tipos;
        private static DateTime f;
        private static string c = "";
        private static string m = "";
        private static string t = "";

        public FechasExamenes()
        {
            InitializeComponent();
        }

        private void FechasExamenes_Load(object sender, EventArgs e)
        {
            DataTable fechas = createFechaExamen.FindAllFechas();

            if (null != fechas)
            {
                foreach (DataRow dr in fechas.Rows)
                {
                    this.dgvFechas.Rows.Add(Convert.ToDateTime(dr["fe_fecha"]).ToShortDateString(), dr["tie_tipo"],
                        dr["mat_nombre"], dr["car_nombre"]);
                }
            }

            DataTable carreras = createCarrera.FindAllCarreras();

            if (null != carreras)
            {
                foreach (DataRow dr in carreras.Rows)
                {
                    this.cmbCarrera.Items.Add(dr["car_nombre"]);
                }
            }

            tipos = createTipoExamen.FindAllTipoExamenes();

            if (null != tipos)
            {
                foreach (DataRow dr in tipos.Rows)
                {
                    this.cmbTipo.Items.Add(dr["tie_tipo"]);
                }
            }

            this.txtFecha.Text = DateTime.Now.ToShortDateString();
        }

        private void cmbCarrera_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.cmbCarrera.Text))
            {
                return;
            }

            this.cmbMateria.Items.Clear();

            materias = createMateria.FindAllMaterias();

            if (null != materias)
            {
                DataRow[] drs = materias.Select("car_nombre = '" + this.cmbCarrera.Text + "'");

                foreach (DataRow dr in drs)
                {
                    this.cmbMateria.Items.Add(dr["mat_nombre"]);
                }
            }
        }

        private void btnNuevoTipo_Click(object sender, EventArgs e)
        {

            general.TipoExamen tipos = new TipoExamen();

            tipos.FormClosed += new FormClosedEventHandler(tipos_FormClosed);

            tipos.Show();
        }

        void tipos_FormClosed(object sender, FormClosedEventArgs e)
        {
            DataTable tipos = createTipoExamen.FindAllTipoExamenes();

            if (null != tipos)
            {
                this.cmbTipo.Items.Clear();

                foreach (DataRow dr in tipos.Rows)
                {
                    this.cmbTipo.Items.Add(dr["tie_tipo"]);
                }
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Validar())
                {
                    List<bo.FechaExamenbo> fechas = createFechaExamen.FindExamenesbyFecha(Convert.ToDateTime(this.txtFecha.Text));

                    bo.FechaExamenbo fecha = (null != fechas) ? fechas.Find(f => (f.Materia.Nombre == this.cmbMateria.Text) && (f.TipoExamen.Tipo == this.cmbTipo.Text)) : null;

                    if (null == fecha)
                    {
                        bo.FechaExamenbo fec = new bo.FechaExamenbo();

                        fec.Fe_fecha = Convert.ToDateTime(this.txtFecha.Text);

                        int mat_id = Convert.ToInt32(materias.Select("mat_nombre = '" + this.cmbMateria.Text + "' AND car_nombre = '" + this.cmbCarrera.Text + "'")[0]["mat_id"]);

                        bo.Materiabo mat = createMateria.FindMateriaByMatId(mat_id);

                        fec.Materia = mat;

                        int tie_id = Convert.ToInt32(tipos.Select("tie_tipo = '" + this.cmbTipo.Text + "'")[0]["tie_id"]);

                        bo.TipoExamenbo tie = createTipoExamen.FindTipoExamenById(tie_id);

                        fec.TipoExamen = tie;

                        bool ingresada = createFechaExamen.SaveFechaExamen(fec);

                        if (ingresada)
                        {
                            MessageBox.Show("Fecha Registrada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            refreshData();
                        }
                        else
                        {
                            MessageBox.Show("Error al Registrar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                    else
                    {
                        MessageBox.Show("La Fecha ya se encuentra Registrada!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }

                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Guardar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.dgvFechas.CurrentCell.Value != null && !m.Equals(""))
                {
                    if (Validar())
                    {
                        List<bo.FechaExamenbo> fechas = createFechaExamen.FindExamenesbyFecha(Convert.ToDateTime(this.txtFecha.Text));

                        bo.FechaExamenbo fecha = (null != fechas) ? fechas.Find(f => (f.Materia.Nombre == this.cmbMateria.Text) && (f.TipoExamen.Tipo == this.cmbTipo.Text)) : null;

                        if (null == fecha)
                        {
                            bo.FechaExamenbo fec = new bo.FechaExamenbo();

                            fec.Fe_fecha = Convert.ToDateTime(this.txtFecha.Text);

                            int mat_id = Convert.ToInt32(materias.Select("mat_nombre = '" + this.cmbMateria.Text + "' AND car_nombre = '" + this.cmbCarrera.Text + "'")[0]["mat_id"]);

                            bo.Materiabo mat = createMateria.FindMateriaByMatId(mat_id);

                            fec.Materia = mat;

                            int tie_id = Convert.ToInt32(tipos.Select("tie_tipo = '" + this.cmbTipo.Text + "'")[0]["tie_id"]);

                            bo.TipoExamenbo tie = createTipoExamen.FindTipoExamenById(tie_id);

                            fec.TipoExamen = tie;

                            int mat_id_anterior = Convert.ToInt32(materias.Select("mat_nombre = '" + m + "' AND car_nombre = '" + c + "'")[0]["mat_id"]);

                            bool modificada = createFechaExamen.ModifyFechaExamen(Convert.ToDateTime(f), mat_id_anterior, fec);

                            if (modificada)
                            {
                                MessageBox.Show("Fecha Modificada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                                refreshData();
                            }
                            else
                            {
                                MessageBox.Show("Error al Modificar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            }
                        }
                        else
                        {
                            MessageBox.Show("La Fecha ya se encuentra Registrada!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }

                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Modificar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.dgvFechas.CurrentCell.Value != null)
                {
                    int mat_id = Convert.ToInt32(materias.Select("mat_nombre = '" + m + "' AND car_nombre = '" + c + "'")[0]["mat_id"]);

                    bool eliminada = createFechaExamen.DeleteFechaExamen(Convert.ToDateTime(f), mat_id);

                    if (eliminada)
                    {
                        MessageBox.Show("Fecha Eliminada!!", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        refreshData();
                    }
                    else
                    {
                        MessageBox.Show("Error al Eliminar!!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            catch (exceptions.blexception)
            {
                MessageBox.Show("Error al Intentar Eliminar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Intentar Eliminar!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Gestión_UTN.util.EscribirLog.escribirArchivo(ex.Message);
            }
        }

        private void LimpiarForm()
        {
            this.txtFecha.Text = DateTime.Now.ToShortDateString();
            this.cmbCarrera.Text = "";
            this.cmbMateria.Text = "";
            this.cmbTipo.Text = "";

        }

        private void refreshData()
        {
            DataTable fechas = createFechaExamen.FindAllFechas();

            if (null != fechas)
            {
                this.dgvFechas.Rows.Clear();

                foreach (DataRow dr in fechas.Rows)
                {
                    this.dgvFechas.Rows.Add(Convert.ToDateTime(dr["fe_fecha"]).ToShortDateString(), dr["tie_tipo"],
                        dr["mat_nombre"], dr["car_nombre"]);
                }
            }

            c = "";
            m = "";
            t = "";

        }

        private void dgvFechas_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dgvFechas.CurrentCell.Value != null)
            {
                f = Convert.ToDateTime(this.dgvFechas.CurrentRow.Cells[0].Value);

                t = this.dgvFechas.CurrentRow.Cells[1].Value.ToString();

                m = this.dgvFechas.CurrentRow.Cells[2].Value.ToString();

                c = this.dgvFechas.CurrentRow.Cells[3].Value.ToString();

                this.txtFecha.Text = f.ToShortDateString();

                this.cmbCarrera.Text = c;

                this.cmbMateria.Text = m;

                this.cmbTipo.Text = t;
            }
        }

        private bool Validar()
        {
            bool checkCarrera = false;
            bool checkMateria = false;
            bool checkTipo = false;
            bool checkFecha = false;

            if (!Validador.es_fecha(txtFecha))
            {
                errProv.SetError(txtFecha, "Formato: ##/##/####");
            }
            else
            {
                errProv.SetError(txtFecha, String.Empty);
                checkFecha = true;
            }

            if (this.cmbCarrera.Text.Equals(""))
            {
                errProv.SetError(cmbCarrera, "Ingrese una Carrera");
            }
            else
            {
                errProv.SetError(cmbCarrera, String.Empty);
                checkCarrera = true;
            }

            if (this.cmbMateria.Text.Equals(""))
            {
                errProv.SetError(cmbMateria, "Ingrese una Materia");
            }
            else
            {
                errProv.SetError(cmbMateria, String.Empty);
                checkMateria = true;
            }

            if (!Validador.es_nombre(cmbTipo))
            {
                errProv.SetError(cmbTipo, "Sólo Letras y Números");
            }
            else
            {
                errProv.SetError(cmbTipo, String.Empty);
                checkTipo = true;
            }

            return (checkTipo && checkMateria && checkCarrera && checkFecha);
        }
    }
}
